//给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。 
//
// 说明：本题中，我们将空字符串定义为有效的回文串。 
//
// 
//
// 示例 1: 
//
// 
//输入: "A man, a plan, a canal: Panama"
//输出: true
//解释："amanaplanacanalpanama" 是回文串
// 
//
// 示例 2: 
//
// 
//输入: "race a car"
//输出: false
//解释："raceacar" 不是回文串
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 2 * 105 
// 字符串 s 由 ASCII 字符组成 
// 
// Related Topics 双指针 字符串 
// 👍 445 👎 0

package leetcode.editor.cn.week1.code;

/**
 * @Author:xpengfei
 * @Date: 2021-12-01 19:23:24
 * @Description：验证回文串
 */
public class Week1_1_Ques125ValidPalindrome {
    public static void main(String[] args) {
        Solution solution = new Week1_1_Ques125ValidPalindrome().new Solution();
        // 正常
        solution.isPalindrome("A man, a plan, a canal: Panama");
        // case  s=""
        solution.isPalindrome(".,");
        //case i>=j
        solution.isPalindrome("aa");
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public boolean isPalindrome(String s) {
            if (s == null || s.length() == 1) {
                return true;
            }
            s = s.toLowerCase();
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
                if ((s.charAt(i) >= '0' && s.charAt(i) <= '9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z')) {
                    stringBuilder.append(s.charAt(i));
                }
            }
            s = stringBuilder.toString();
            int i = 0, j = s.length() - 1;
            while (i < j) {
                if (s.charAt(i) == s.charAt(j)) {
                    i++;
                    j--;
                } else {
                    return false;
                }
            }
            return s.length() == 0 || i >= j;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}